<?php
/**
 * 此题无解 中转输入脚本 测试版
 *
 * @category   公用函数
 * @author      此题无解
 * 更多Web安全交流 Q群：260044099
 */
define('DEBUG', true);
define('VERSION', '0.1 测试版');
define('PROJECTNAME', '此题无解PHP中转脚本');
define('AUTHOR', '此题无解');
define('QUN', '260044099');

$configfile = "config.xml";
$theme = "default";
$REPLACETAG = '[ctwj]';
$PackageChecked = array(
    'user-agent','cookie',
    );
$IgnoryFiled = array(
	'host', 'referer'
	);

/**
 * [CheckVaild 检查要中转的数据是否完整]
 * @param [type] $data           [提交的中转数据]
 * @param [type] $REPLACETAG     [伪静态模式中，替换的字符串]
 * @param [type] $PackageChecked [列表，在这个列表中的字符串，可作为参数如user-agent]
 */
function CheckVaild($data, $REPLACETAG, $PackageChecked)
{
	$isPackage = array_key_exists('header', $data);
	$isFakeUrl = array_key_exists('fakeurl', $data);
	if ($data['method'] == 'Post') $isPost = True;
	else $isPost = false;
	// $isPost = in_array('Post', $data);
	//print_r($data);die();

	//如果是菜刀中转，只要检测URL就好；
	$isChopper = array_key_exists('method_ext', $data) && $data['method_ext']=='chopper';
	if ($isChopper) {
		if(array_key_exists('url', $data)){
			return true;
		} else {
			$result = array('status'=>'no','info'=>'没有url');
			return $result;
		}
	}

	//常规参数检测
	if ($isPost && !array_key_exists('postparam', $data)){
	    $result = array('status'=>'no','info'=>'没有指定POST值');
	    return $result;
	}
	if (!$isFakeUrl && !array_key_exists('injectparam', $data)) {
	    $result = array('status'=>'no','info'=>'没有指定中转参数');
	    return $result;
	}

	if (!$isPackage) {  //如果不是包，是一个url
	    if (!array_key_exists('url', $data)) $result = array('status'=>'no','info'=>'缺少参数,url');
	    if ($isFakeUrl){
	        if (!strpos($data['url'], $REPLACETAG)) {
	            //没有找到[ctwj],看在不在post参数里
	            if ($isPost && strpos($data['postparam'], $REPLACETAG)!==false){}
	            else $result = array('status'=>'no','info'=>'没有在url或post参数中找到[ctwj]');
	        }
	    } else {
	       //检查参数是否存在
	       if (!array_key_exists('injectparam', $data)) $result = array('status'=>'no','info'=>'没有在url中找到[ctwj]');
	       else {
	            //检测参数是否在提交的URL中
	            if (strpos($data['url'], '&'.$data['injectparam']) || strpos($data['url'], '?'.$data['injectparam'])){}
	            else {
	                if ($isPost && strpos($data['postparam'], $data['injectparam'])!==false){}
	                else $result = array('status'=>'no','info'=>'没有在url或post参数中找到[ctwj]');
	            }
	       }
	    }
	} else {  //如果是包
	    $isOK = false;
	    $lines = explode("\n", $data['header']);

	    if ($isFakeUrl){        //伪静态
	        if (!strpos($lines[0], $REPLACETAG)) {
	            for ($i = 1; $i<count($lines); $i++) {
	                if (strpos($lines[$i], $REPLACETAG)) {$isOK = true;break;}
	            }
	            if (!$isOK) $result = array('status'=>'no','info'=>'没有在Package中找到[ctwj]'); 
	        } 
	    } else {
	       //检查参数是否存在
	       
	       if (!in_array($data['injectparam'], $PackageChecked)){  //是不是UA什么的
	            if (strpos($lines[0], '&'.$data['injectparam']) || strpos($lines[0], '?'.$data['injectparam'])){$isOK = true;}
	            else {
	                for ($i = 1; $i<count($lines)-1; $i++) {
	                    $info = explode(':', $lines[$i]);
	                    if (strtolower($info[0]) == 'referer') continue; //referer 里面的不算吧
	                    if (in_array(strtolower($info[0]), $PackageChecked) || strpos($lines[$i], $REPLACETAG)) {
	                       $isOK = true;break;
	                    }
	                }  
	            } 
	            if (!$isOK) $result = array('status'=>'no','info'=>'没有在Package中找到参数'); 
	        } 
	       
	    }
	}
	if (isset($result)) return $result;
	else return True;
}

?>